package br.com.infnet.projeto.bloco.dao.impl;

import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.infnet.projeto.bloco.dao.ContaEletronicaDAO;
import br.com.infnet.projeto.bloco.exception.ObjetoNaoEncontradoException;
import br.com.infnet.projeto.bloco.model.ContaEletronica;

public class ContaEletronicaDAOImpl implements ContaEletronicaDAO {

	private EntityManager entityManager;

	public ContaEletronicaDAOImpl(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public long incluir(ContaEletronica contaEletronica) {
		entityManager.persist(contaEletronica);
		return contaEletronica.getId();
	}

	public boolean excluir(ContaEletronica contaEletronica) {
		try {
			ContaEletronica conta = entityManager.getReference(
					ContaEletronica.class, new Long(contaEletronica.getId()));
			entityManager.remove(conta);
			return true;
		} catch (EntityNotFoundException e) {
			return false;
		}
	}

	public boolean alterar(ContaEletronica contaEletronica) {
		try {
			entityManager.getReference(ContaEletronica.class, new Long(
					contaEletronica.getId()));
			entityManager.merge(contaEletronica);
			return true;
		} catch (EntityNotFoundException e) {
			return false;
		}
	}

	public ContaEletronica buscar(long id) throws ObjetoNaoEncontradoException {

		ContaEletronica contaEletronica = (ContaEletronica) entityManager.find(
				ContaEletronica.class, new Long(id));

		if (contaEletronica == null) {
			throw new ObjetoNaoEncontradoException();
		}
		return contaEletronica;
	}
	
	public ContaEletronica buscarPorNumero(Long numeroConta) throws ObjetoNaoEncontradoException {
		try
		{
			Query query = entityManager.createQuery("select c from ContaEletronica c where c.numero = :numeroConta");
			query.setParameter("numeroConta", numeroConta);
			ContaEletronica contaEletronica = (ContaEletronica) query.getSingleResult();
			return contaEletronica;
		}
		catch(NoResultException e)
		{
			throw new ObjetoNaoEncontradoException();
		}
	}
}
